package sv.gob.mh.dgii.service.rc;

import java.util.Date;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sv.gob.mh.dgii.common.Utils;
import sv.gob.mh.dgii.dao.rc.RiskDao;
import sv.gob.mh.dgii.model.RcDocIdentidad;
import sv.gob.mh.dgii.model.RcRuc;

@Service
public class RcRucRiskServiceImpl implements RcRucRiskService {
	
	private static final String _SV_CODE = "9300";

	@Autowired
	private RiskDao riskDao;

	public String getRiskDB(RcRuc contrib) throws Exception {
		return riskDao.getRiskDB(contrib);
	}

	/**
	 * Alto
	 * <ul>
	 * <li>nombre + fecha</li>
	 * <li>nombre completo ( nombres + apellidos ) </li>
	 * <li>nombre completo + departamento + municipio </li>
	 * <li>mismo documento de identidad </li>
	 * </ul>
	 * 
	 * @param contrib
	 * @param contList
	 * @return
	 */
	public Boolean isHighRisk(RcRuc contrib, List<RcRuc> contList) {
		for (RcRuc contributor : contList) {
			/*
			 * if(isSameShortName(contrib, contributor) &&
			 * isSameBirthDate(contrib, contributor)){ return true; }
			 * 
			 * if(isSameFullName(contrib, contributor)){ return true; }
			 * if(isSameFullName(contrib, contributor) &&
			 * isSameMunicipio(contrib, contributor)){ return true; }
			 * 
			 * if(isSameDocId(contrib, contributor)){ return true; }
			 */
			if (isSameFirstName(contrib, contributor)
					&& isSameFirstLastName(contrib, contributor)
					&& isSameSecondLastName(contrib, contributor)
					&& isSameMunicipio(contrib, contributor)
					&& isSameBirthDate(contrib, contributor)) {				
				return true;
			}

		}
		// for

		return false;
	}

	/**
	 * Medio
	 * <ul>
	 * <li>1 nombre + 1 apellido + fecha de nacimiento</li>
	 * </ul>
	 * 
	 * @param contrib
	 * @param listItem
	 * @return
	 */
	public Boolean isMediumRisk(RcRuc contrib, List<RcRuc> contList) {
		for (RcRuc contributor : contList) {
			if (contrib.equals(contributor)) {
				continue;
			}
			if (isSameFirstName(contrib, contributor)
					&& (isSameFirstLastName(contrib, contributor) || isSameSecondLastName(
							contrib, contributor))
					&& isSameBirthDate(contrib, contributor)) {
				return true;
			}
		}// for
		return false;
	}

	/**
	 * Compara el primer nombre y el primer apellido
	 * 
	 * @param contrib
	 * @param listItem
	 * @return
	 */
	public Boolean isSameShortName(RcRuc contrib, RcRuc listItem) {
		return isSameFirstName(contrib, listItem)
				&& isSameFirstLastName(contrib, listItem);
	}

	/**
	 * @param contrib
	 * @param listItem
	 * @return
	 */
	public Boolean isSameDocId(RcRuc contrib, RcRuc listItem) {
		Set<RcDocIdentidad> ids = contrib.getRcDocIdentidads();
		for (RcDocIdentidad identidadDTO : ids) {
			if (Utils.in(identidadDTO, listItem.getRcDocIdentidads().toArray())) {
				return true;
			}
		}
		return false;
	}

	public Boolean isSameFirstLastName(RcRuc contrib, RcRuc listItem) {
		String apeRasoc01 = contrib.getS1apeRasoc();
		String apeRasoc02 = listItem.getS1apeRasoc();
		return Utils.secureEqualsString(apeRasoc01, apeRasoc02);
	}

	public Boolean isSameFirstName(RcRuc contrib, RcRuc listItem) {
		String snombres01 = contrib.getSnombres();
		String snombres02 = listItem.getSnombres();
		return Utils.secureEqualsString(snombres01, snombres02);
	}

	public Boolean isSameSecondLastName(RcRuc contrib,
			RcRuc listItem) {
		String apeAbrev01 = contrib.getS2apeAbrev();
		String apeAbrev02 = listItem.getS2apeAbrev();
		return Utils.secureEqualsString(apeAbrev01, apeAbrev02);
	}

	public Boolean isSameFullName(RcRuc contrib, RcRuc listItem) {
		return isSameShortName(contrib, listItem)
				&& isSameSecondLastName(contrib, listItem);
	}

	public Boolean isSameBirthDate(RcRuc contrib, RcRuc listItem) {
		Date birth01 = contrib.getFnacConst();
		Date birth02 = listItem.getFnacConst();
		return birth01.equals(birth02);
	}

	public Boolean isSameMunicipio(RcRuc contrib, RcRuc listItem) {
		String depto01 = contrib.getTbMunicipio().getId().getCdepartamento();
		String depto02 = listItem.getTbMunicipio().getId().getCdepartamento();
		String munic01 = contrib.getTbMunicipio().getId().getCmunicipio();
		String munic02 = listItem.getTbMunicipio().getId().getCmunicipio();

		return Utils.secureEqualsString(munic01, munic02)
				&& Utils.secureEqualsString(depto01, depto02);
	}

	/**
	 * @return the riskDao
	 */
	public RiskDao getRiskDao() {
		return riskDao;
	}

	/**
	 * @param riskDao
	 *            the riskDao to set
	 */
	public void setRiskDao(RiskDao riskDao) {
		this.riskDao = riskDao;
	}
	
	public String getRiesgo (RcRuc risk, RcRuc dto) {
		String riesgo = RIESGO_INDETERMINADO;
		//1ape
		if(risk.getS1apeRasoc().equalsIgnoreCase(dto.getS1apeRasoc().trim())){
			//Natural
			if(dto.getTbTipoContrib().getId().getCclase().equals("N")){
				//1ape + nombres
				if(risk.getSnombres().equalsIgnoreCase(dto.getSnombres().trim())){
					//Nacional
					if(dto.getTbPais().getCpais().equals(_SV_CODE)){
						//1ape + nombres + dpto + mun
						if(risk.getTbMunicipio().getId().getCdepartamento().equals(dto.getTbMunicipio().getId().getCdepartamento())
							&& risk.getTbMunicipio().getId().getCmunicipio().equals(dto.getTbMunicipio().getId().getCmunicipio())){
							riesgo = RIESGO_MEDIO;
						}
						//1ape + nombres + fnac
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							if(riesgo.equals(RIESGO_MEDIO)){
								//1ape + 2ape + nombres + fnac + dpto + mun
								if(!Utils.isNullOrEmpty(risk.getS2apeAbrev()) 
									&& !Utils.isNullOrEmpty(dto.getS2apeAbrev()) 
									&& risk.getS2apeAbrev().equalsIgnoreCase(dto.getS2apeAbrev().trim())){
									riesgo = RIESGO_ALTO;
								}
								else{
									//Si coinciden en no tener 2o apellido.
									if( Utils.isNullOrEmpty(risk.getS2apeAbrev())
											&& Utils.isNullOrEmpty(dto.getS2apeAbrev()) ){
										riesgo = RIESGO_ALTO;
									}
								}
							}
							//1ape + nombres + fnac
							else{
								riesgo = RIESGO_BAJO;
							}
						}
					}
					//Extranjera
					else{
						//1ape + nombres + pais
						if(risk.getTbPais().getCpais().equals(dto.getTbPais().getCpais())){
							riesgo = RIESGO_MEDIO;
						}
						//1ape + nombres + fnac
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							if(riesgo.equals(RIESGO_MEDIO)){
								//1ape + 2ape + nombres + pais + fnac
								if(!Utils.isNullOrEmpty(risk.getS2apeAbrev())
									&& !Utils.isNullOrEmpty(dto.getS2apeAbrev())
									&& risk.getS2apeAbrev().equalsIgnoreCase(dto.getS2apeAbrev().trim())){
									riesgo = RIESGO_ALTO;
								}
								else{
									//Si coinciden en no tener 2o apellido.
									if( Utils.isNullOrEmpty(risk.getS2apeAbrev())
											&& Utils.isNullOrEmpty(dto.getS2apeAbrev()) ){
										riesgo = RIESGO_ALTO;
									}
								}
							}
							//1ape + nombres + fnac
							else{
								riesgo = RIESGO_BAJO;
							}
						}
					}
				}
			}
			//Juridica
			else{
				riesgo = RIESGO_BAJO;
				//Nacional
				if(dto.getTbPais().getCpais().equals(_SV_CODE)){
					//1ape + dpto + mun
					if(risk.getTbMunicipio().getId().getCdepartamento().equals(dto.getTbMunicipio().getId().getCdepartamento())
					  && risk.getTbMunicipio().getId().getCmunicipio().equals(dto.getTbMunicipio().getId().getCmunicipio())){
						//1ape + fnac + dto + mun
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							riesgo = RIESGO_ALTO;
						}
						else{
							riesgo = RIESGO_MEDIO;
						}
					}
				}
				//Extranjera
				else{
					//1ape + pais
					if(risk.getTbPais().getCpais().equals(dto.getTbPais().getCpais())){
						//1ape + pais + fnac
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							riesgo = RIESGO_ALTO;
						}
						else{
							riesgo = RIESGO_MEDIO;
						}
					}
				}
			}
		}
		return riesgo;
	}

	/****
	 * Comento el anterior m�todo getRiesgo, debido a la alta probabilidad 
	 * que usuario experto cambie de opini�n respecto a las nuevas reglas 27/08/09
	 *
	public String getRiesgo(Contributor risk, Contributor dto) {

		String riesgo = "I";

		log.debug(Utils.isNullOrEmpty(dto.getS2apeAbrev()));

		if (Utils.isNullOrEmpty(dto.getS2apeAbrev())) {
			if (risk.getS1apeRasoc().equalsIgnoreCase(dto.getS1apeRasoc())
					&& risk.getSnombres().equalsIgnoreCase(dto.getSnombres())) {
				riesgo = RIESGO_BAJO;
			}

			if (risk.getFnacConst().equals(dto.getFnacConst())
					&& risk.getS1apeRasoc().equalsIgnoreCase(
							dto.getS1apeRasoc())
					&& risk.getSnombres().equalsIgnoreCase(dto.getSnombres())) {
				riesgo = RIESGO_MEDIO;
			}

			// Si no hay segundo apellido y es de El salvador
			if (dto.getTbPais().getCpais().equals("9300")) {

				if (risk.getFnacConst().equals(dto.getFnacConst())
						&& risk.getS1apeRasoc().equalsIgnoreCase(
								dto.getS1apeRasoc())
						&& risk.getSnombres().equalsIgnoreCase(
								dto.getSnombres())
						&& risk.getTbMunicipio().getCmunicipio().equals(
								dto.getTbMunicipio().getCmunicipio())
						&& risk.getTbMunicipio().getCdepartamento().equals(
								dto.getTbMunicipio().getCdepartamento())
						&& risk.getTbPais().getCpais().equals(
								dto.getTbPais().getCpais())) {
					riesgo = RIESGO_ALTO;
				}

			} else {
				// Si es extranjero sin segundo apellido
				if (risk.getFnacConst().equals(dto.getFnacConst())
						&& risk.getS1apeRasoc().equalsIgnoreCase(
								dto.getS1apeRasoc())
						&& risk.getSnombres().equalsIgnoreCase(
								dto.getSnombres())
						&& risk.getTbPais().getCpais().equals(
								dto.getTbPais().getCpais())) {
					riesgo = RIESGO_ALTO;
				}

			}

		} else {
			if(!Utils.isNullOrEmpty(risk.getS2apeAbrev())){
				if (risk.getS1apeRasoc().equalsIgnoreCase(dto.getS1apeRasoc())
						&& risk.getS2apeAbrev().equalsIgnoreCase(
								dto.getS2apeAbrev())
						&& risk.getSnombres().equalsIgnoreCase(dto.getSnombres())) {
					riesgo = RIESGO_BAJO;
				}
	
				if (risk.getFnacConst().equals(dto.getFnacConst())
						&& risk.getS1apeRasoc().equalsIgnoreCase(
								dto.getS1apeRasoc())
						&& risk.getS2apeAbrev().equalsIgnoreCase(
								dto.getS2apeAbrev())
						&& risk.getSnombres().equalsIgnoreCase(dto.getSnombres())) {
					riesgo = RIESGO_MEDIO;
	
				}
	
				// Si tiene 2 apellido y es de El salvador
				if (dto.getTbPais().getCpais().equals("9300")) {
	
					if (risk.getFnacConst().equals(dto.getFnacConst())
							&& risk.getS1apeRasoc().equalsIgnoreCase(
									dto.getS1apeRasoc())
							&& risk.getS2apeAbrev().equalsIgnoreCase(
									dto.getS2apeAbrev())
							&& risk.getSnombres().equalsIgnoreCase(
									dto.getSnombres())
							&& risk.getTbMunicipio().getCmunicipio().equals(
									dto.getTbMunicipio().getCmunicipio())
							&& risk.getTbMunicipio().getCdepartamento().equals(
									dto.getTbMunicipio().getCdepartamento())
							&& risk.getTbPais().getCpais().equals(
									dto.getTbPais().getCpais())) {
						riesgo = RIESGO_ALTO;
					}
	
				} else {
					// Si es extranjero y tiene segundo apellido.
					if (risk.getFnacConst().equals(dto.getFnacConst())
							&& risk.getS1apeRasoc().equalsIgnoreCase(
									dto.getS1apeRasoc())
							&& risk.getS2apeAbrev().equalsIgnoreCase(
									dto.getS2apeAbrev())
							&& risk.getSnombres().equalsIgnoreCase(
									dto.getSnombres())
							&& risk.getTbPais().getCpais().equals(
									dto.getTbPais().getCpais())) {
						riesgo = RIESGO_ALTO;
					}
	
				}
			}
		}

		return riesgo;
	}
	*/

}
// class